#include <thread>
#include <iostream>
#include <unistd.h>
using namespace std;
// g++ -pthread thread_6.cpp -o thread_6
// 普通函数
void func(int bh, const string& str){
   for(int i = 1; i < 10; i++){
    cout << "第" << i << "次表白：亲爱的" << bh << "号, " << str << endl;
    usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
   }
}

// 仿函数
class mythread1
{
public:
    void operator()(int bh, const string& str){
   for(int i = 1; i < 10; i++){
    cout << "第" << i << "次表白：亲爱的" << bh << "号, " << str << endl;
    usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
   }
}
};

// 类中有静态成员函数
class mythread2
{
public:
   static void func(int bh, const string& str){
   for(int i = 1; i < 10; i++){
    cout << "第" << i << "次表白：亲爱的" << bh << "号, " << str << endl;
    usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
         }
    }   
};

// 类中有普通成员函数
class mythread3
{
public:
 void func(int bh, const string& str){
   for(int i = 1; i < 10; i++){
    cout << "第" << i << "次表白：亲爱的" << bh << "号, " << str << endl;
    usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
         }
    }   
};

int main()
{
    // 用普通函数创建线程
   thread t1(func,3,"我是一只傻傻鸟。");
   thread t2(func,8,"我是一只小小鸟。");
   
   // 用lambda函数创建线程
   auto f = [](int bh, const string& str){
   for(int i = 1; i < 10; i++){
            cout << "第" << i << "次表白：亲爱的" << bh << "号, " << str << endl;
            usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
        }
    };
    thread t3(func,3,"我是一只傻傻鸟。");

  // 用仿函数创建线程
    thread t4(mythread1(),3,"我是一只傻傻鸟。");

  // 用类的静态成员函数创建线程
  thread t5(mythread2::func,3,"我是一只傻傻鸟。");

 // 用类的普通成员函数创建线程
  mythread3 myth;  // 必须先创建类的对象，必须保证对象的生命周期比子线程要长
  thread t6(&mythread3::func, &myth,3,"我是一只傻傻鸟。"); // 第二个参数必须填对象的this指针

   cout << "任务开始.\n";
   for(int i = 0; i < 10; i++){
    cout << "执行任务中......\n";
    usleep(1000000);  // 睡眠 1000000 微秒（1 秒）
   }
   cout << "任务完成.\n";
    t1.join();   // 回收线程t1的资源
    t2.join();   // 回收线程t2的资源
    t3.join();   // 回收线程t3的资源
    t4.join();   // 回收线程t4的资源
    t5.join();   // 回收线程t5的资源
    t6.join();   // 回收线程t6的资源
}